/** ***********************************************************************************
* @file         log_task.h
* @brief        系统日志管理任务
* @details      主要使用来处理系统日志管理，提供日志接口
* @author       杨小珛
* @date         2020/12/24
* @copyright    北京高知科技有限公司    
* @version      V1.0
* @attention    无
**************************************************************************************/
#ifndef SYS_LOG_TASK_H
#define SYS_LOG_TASK_H

#include "os_app.h"
#include "sys_err_list.h"

/****************************************************************************************
* 串口打印的模式
******************************************************************************************/
typedef enum
{
    DEBUG_MODE = 0x00,// 调试信息
    INFOR_MODE,         // 打印信息
    ERROR_MODE,         // 错误信息
    DEFAULE_MODE,       // 没有任何模式
} log_print_mode_enum;

/****************************************************************************************
* 定义数据发送结构体
******************************************************************************************/
#define  DEBUG_UART_TX_DATA_TIME        ( 100 )
#define  DEBUG_UART_TX_QUEUE_MAX_NUM    50                      //debug 消息队列 最大
#define  DEBUG_UART_TX_QUEUE_LEN        4096

#define  MSG_LOG_SAM_REV_WAIT_TIME      ( 1000 )                // log接收等待消息发送数据消息的时间
#define  MSG_SET_SAMT_REV_WAIT_TIME     ( 1000 )            

typedef  struct
{
   uint16_t      DataLen;
   uint8_t       pData[DEBUG_UART_TX_QUEUE_LEN + 8];
}debug_msg_typedef;

/*LOG打印信息统计*/
typedef  uint32_t log_queue_space;

/****************************************************************************************
* 错误码发送状态
******************************************************************************************/
#define LOG_ERROR_INDEX_LEN ( 4 )
#define LOG_ERROR_CODE_SAVE_TIME ( 3600 )
#define LOG_ERROR_LOG_MAX_LEN ( 128 )

typedef struct
{
	union
    {
        uint8_t     index;       // 索引状态
        struct
        {
            uint8_t b0write     : 1;  // 数据开始写入 0 写入 
            uint8_t b0read      : 1;  // 数据开始读取 0 读取
            uint8_t b1write     : 1;  // 数据开始写入 0 写入 
            uint8_t b1read      : 1;  // 数据开始读取 0 读取
            uint8_t b2write     : 1;  // 数据开始写入 0 写入 
            uint8_t b2read      : 1;  // 数据开始读取 0 读取
            uint8_t b3write     : 1;  // 数据开始写入 0 写入 
            uint8_t b3read      : 1;  // 数据开始读取 0 读取
        };
    };
} log_error_index_t;

typedef struct
{
    uint32_t    num;    // 错误代码产生的数量
    uint32_t    len;    // 错误代码存储空间长度
    uint8_t     *id;    // 错误代码 ID
    uint32_t    *time;  // 产生错误码时间戳
}log_error_code_t;

/** ****************************************************************************
* @remarks       void log_create_task( unsigned portBASE_TYPE uxPriority )
* @brief         创建系统日志管理任务
* @param[in]     uxPriority 优先级
* @param[out]    无
* @return        无
* @attention     在系统启动后进行创建
*******************************************************************************/
extern void log_create_task( unsigned portBASE_TYPE uxPriority );

/** ****************************************************************************
* @remarks       uint32_t log_debug_send( log_print_mode_enum mode ,char *name ,void * pbuf, uint16_t dlen )
* @brief         添加系统日志打印消息头
* @param[in]     mode 打印日志的模式
* @param[in]     * name 打印日志的任务名称
* @param[in]     * pbuf 打印数据源地址
* @param[in]     dlen 打印数据的长度
* @param[out]    无
* @return        pdPASS 数据发送成功 ， pdFAIL 数据发送失败
* @attention     函数的功能是将打印的数据前装到消息队列中，发送发送给任务进行数据发送
*******************************************************************************/
extern uint32_t log_debug_send( log_print_mode_enum mode ,char *name ,void * pbuf, uint16_t dlen );

/** ****************************************************************************
* @remarks       uint32_t log_debug_printf(log_print_mode_enum mode,char *name,const char *s, ...)
* @brief         添加系统日志打印消息头
* @param[in]     mode 打印日志的模式
* @param[in]     * name 打印日志的任务名称
* @param[in]     *s 打印日志的目标地址
* @param[in]     ... 输入参数
* @param[out]    无
* @return        pdPASS 数据发送成功 ， pdFAIL 数据发送失败
* @attention     函数的功能是将打印的数据前装到消息队列中，发送发送给任务进行数据发送
*******************************************************************************/
extern uint32_t log_debug_printf(log_print_mode_enum mode,char *name,const char *s, ...);

/** ****************************************************************************
* @remarks       uint32_t log_error_code_list_read( uint16_t *err )
* @brief         读取系统错误日志代码
* @param[in]     无
* @param[out]    *err 错误ID代码
* @return        pdPASS 读取数据成功 ， pdFAIL 读取数据失败
* @attention     无
*******************************************************************************/
extern uint32_t log_error_code_list_read( uint16_t *err );

/** ****************************************************************************
* @remarks       uint32_t log_error_code_list_len( void )
* @brief         获取取系统错误日志代码 长度
* @param[in]     无
* @param[out]    无
* @return        错误代码长度
* @attention     无
*******************************************************************************/
extern uint32_t log_error_code_list_len( void );

/** ****************************************************************************
* @remarks       void log_error_code_flash_write( void )
* @brief         系统错误日志代码写入FLASH 中
* @param[in]     无
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void log_error_code_flash_write( void );

/** ****************************************************************************
* @remarks       uint32_t log_error_code_list_total_read( uint8_t *err_buf )
* @brief         获取所有的故障代码
* @param[in]     无
* @param[out]    *err_buf 故障代码目标地址
* @return        错误代码长度
* @attention     无
*******************************************************************************/
extern uint32_t log_error_code_list_total_read( uint8_t *err_buf );

#endif

